/**
 * TemplateSingleton.h
 *
 *  Created on: 27/12/2009
 *      Author: San Martín, Matías I.
 */

#ifndef TEMPLATESINGLETON_H_
#define TEMPLATESINGLETON_H_

/**
* La clase que se va a "hacer Singleton", o sea T, debe heredar _con_herencia_privada_ de Singleton,
* y poner la siguiente línea en su sección pública:
* typedef SingletonTemplate<NombreClase> NombreClaseSingleton;
* Luego, se accede a la instancia con NombreClaseSingleton::instance.
* La herencia privada garantiza que no se copie ni asigne, y el template garantiza el acceso vía instance().
* Esta implementacion es la que se conoce como "Singleton Meyer" y no es perfecta, pero para usos sencillos
* es suficiente (ver capitulo 6 del Alexandrescu)
*/
template<typename T>
class SingletonTemplate{
public:
	static T& instance(){
		static T objeto; // Se crea solo la primera vez
		return objeto;
	}
	virtual ~SingletonTemplate();
private:
	SingletonTemplate(){}
};

class Singleton{
private:
	Singleton(const Singleton &);
	Singleton& operator=(const Singleton &);
public:
	Singleton(){}
	virtual ~Singleton(){}
};

#endif /* TEMPLATESINGLETON_H_ */
